草庐IT

Java Swingworker 和多线程

全部标签

C++ - 传递给线程的数据应该是易变的吗?

在MicrosoftVisualC++中,我可以通过使用一个void*参数启动函数来调用CreateThread()来创建线程。我将一个指向结构的指针作为该参数传递,我看到很多其他人也这样做。我的问题是,如果我传递一个指向我的结构的指针,我如何知道在调用CreateThread()之前结构成员是否已实际写入内存?是否可以保证它们不会被缓存?例如:structbigapple{stringcolor;intcount;}apple;apple.count=1;apple.color="red";hThread=CreateThread(NULL,0,myfunction,&apple,0

c++ - winsock2线程安全吗?

我正在编写一个包含3个服务器和1个客户端的小型程序。2个服务器发送tcp消息,最后一个使用winsock2发送upd数据报。我想知道我是否可以通过使用线程(OpenMP或boost::threads)进行同步recvfrom(),以便2个线程同时从同一端口上的同一套接字监听。我在windows7上使用VC++2010。感谢您的帮助。 最佳答案 是的,套接字是线程安全的,但是您必须小心。一种常见的模式(当使用阻塞IO时)是让一个线程在套接字上接收数据,而另一个线程在同一个套接字上发送数据。让多个线程从一个套接字接收数据通常对UDP套接

c++ - 从多个线程更新最大值

有没有办法使用原子操作从多个线程更新最大值?示例:std::vectorcoord_max(128);#pragmaompparallelforfor(inti=0;i在上面的例子中,关键部分同步访问整个vector,而我们只需要独立同步访问每个值。 最佳答案 根据评论中的建议,我找到了一个不需要锁定的解决方案,而是使用std::atomic/boost::atomic中的比较和交换功能。我仅限于C++03,所以在这种情况下我会使用boost::atomic。BOOST_STATIC_ASSERT(sizeof(int)==size

c++ - 在 DLL 中创建线程

我正在开发一个.NET探查器,它是用C++编写的(一个使用ATL的dll)。我想创建一个线程,每30秒写入一个文件。我希望线程函数成为我的一个类的方法DWORDWINAPICProfiler::MyThreadFunction(void*pContext){//Instructionsthatmanipulateattributesfrommyclass;}当我尝试启动线程时HANDLEl_handle=CreateThread(NULL,0,MyThreadFunction,NULL,0L,NULL);我得到了这个错误:argumentoftype"DWORD(__stdcallCP

C++ - 没有像 mutex_Lock 这样的协调机制的线程

我两天前参加了一次面试。面试的人擅长C++,但不擅长多线程。当他让我为两个线程的多线程编写代码时,其中一个线程打印1,3,5,..而另一个打印2,4,6,..。但是,输出应该是1,2,3,4,5,....所以,我给出了下面的代码(sudo代码)mutex_LockLOCK;intlast=2;intlast_Value=0;voidfunction_Thread_1(){while(1){mutex_Lock(&LOCK);if(last==2){cout在此之后,他说“即使没有那些锁,这些线程也能正常工作。那些锁会降低效率”。我的意思是没有锁会有这样一种情况,一个线程将检查(last

c++ - 为什么必须显式加入线程?

所以这看起来很简单:#include#includevoidsecond(){cout如果我不包含join(),那么系统会调用abort()。我不明白这个,线程不应该自己退出吗?必须加入线程似乎会使代码更难正确封装。这是怎么回事? 最佳答案 那是C++线程库设计的一部分。您不需要加入线程,您也可以分离它。但我不建议您默认使用detach线程,因为这会带来一系列复杂问题。与您所说的相反,我认为这根本不会使代码更难封装。有不同的抽象级别,选择线程级别意味着您需要意识到存在线程并且需要处理它们。对于不同的事物你可以选择不同层次的抽象,例如

c++ - 使用多线程调试 DLL (/MDd) C 运行时库构建静态 Opencv 库

我现在正在尝试使用cmake构建opencv,如果我使用以下命令:cmake-DBUILD_SHARED_LIBS=OFF..我可以构建静态OPENCV库。但是,构建的库静态链接C运行时库。在VC2010中,它使用多线程调试(/MTd)选项。我期望的是动态链接C运行时库,并且在VC2010中使用/MDd选项,那么我该怎么做才能使它成为可能?谢谢。 最佳答案 将-DBUILD_WITH_STATIC_CRT=OFF添加到CMake命令行:cmake-DBUILD_SHARED_LIBS=OFF-DBUILD_WITH_STATIC_C

c++ - 与 OpenSSL 的多线程通信

我正在使用OpenSSL与服务器通信。我可以随时向服务器发送数据,服务器可能会也可能不会发回响应。服务器也可以在没有请求的情况下向客户端发送数据。我在使用BIO_new_ssl_connect制作的BIO上使用SSL,然后使用SSL_read和SSL_write。我的第一个方法是使用阻塞套接字。我会启动一个线程并在循环中对其调用SSL_read。每个调用都会阻塞并仅在读取某些数据时返回。每次通话后,我都可以打包数据并将其发送到某个地方。当我必须写入时,我只需从另一个线程调用SSL_write。我不知道在不同线程的同一连接上执行SSL_read时调用SSL_write是否有效。当我尝试断

c++ - strtol、strtoll、strtod真的是线程安全的吗?

我知道如何将字符串转换为int、float...从来都不是一个新问题。在浏览了一些文章后,建议我使用strtol、strtoll、strtod,因此我仔细研究了这些函数。虽然strtol在其manpage中声称是线程安全的,但是它会修改errno,那么它真的是线程安全的吗?如果不是,在C++(而非C++11)中执行此类转换作业并保持线程安全的正确方法是什么? 最佳答案 来自errnomanpage:errnoisdefinedbytheISOCstandardtobeamodifiablelvalueoftypeint,andmus

c++ - 确保线程不会两次锁定互斥体?

假设我有一个线程运行成员方法,例如下面的示例中的runController:classSomeClass{public:SomeClass(){//StartcontrollerthreadmControllerThread=std::thread(&SomeClass::runController,this)}~SomeClass(){//StopcontrollerthreadmIsControllerThreadInterrupted=true;//waitforthreadtodie.std::unique_locklk(mControllerThreadAlive);}//B